package com.neusoft.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * SHA-256加密算法
 * 
 * @author  郑兴龙 zheng-xl@neusoft.com
 */
public final class SHA256Encrypt
{
    /**
     * 加密算法：SHA-256
     */
    private static final String ALGORITHM = "SHA-256";
    
    /**
     * SHA-256加密后的密文长度：32
     */
    private static final int SHA256_SIZE = 256 / Byte.SIZE;
    
    /**
     * 十六进制无符号数形式的字符串的长度
     */
    private static final int HEX_STR_SIZE = 2;
    
    /**
     * 字节掩码
     */
    private static final int BYTEMASK = 0xff;
    
    /**
     * <私有构造函数>
     */
    private SHA256Encrypt()
    {
    }
    
    /**
     * 使用SHA-256加密字符串
     * @param str 待加密的字符串
     * @return SHA-256加密后的字符串
     * @see [类、类#方法、类#成员]
     */
    public static String encrypt(String str)
    {
        try
        {
            // 获得字符串的字节数组
            byte[] strBytes = str.getBytes();
            
            // 获得SHA-256算法的信息摘要
            MessageDigest md = MessageDigest.getInstance(ALGORITHM);
            
            // 使用指定的 byte 数组对摘要进行最后更新，然后完成摘要计算并将哈希值保存到byte数组中
            byte[] b = md.digest(strBytes);
            StringBuilder output = new StringBuilder(SHA256_SIZE);
            String temp = "";
            for (int i = 0; i < b.length; i++)
            {
                // 以十六进制无符号整数形式返回一个整数参数的字符串
                temp = Integer.toHexString(b[i] & BYTEMASK);
                if (temp.length() < HEX_STR_SIZE)
                {
                    output.append("0");
                }
                output.append(temp);
            }
            
            return output.toString();
        }
        catch (NoSuchAlgorithmException e)
        {
            return null;
        }
    }
}
